package com.market.mapper;

import com.market.entity.Bill;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface BillMapper{
    /**
     * 查询所有账单
     */
    List<Bill> findAll();
    
    /**
     * 根据ID查询账单
     */
    Bill findById(Long id);
    
    /**
     * 根据条件查询账单列表
     */
    List<Bill> findByCondition(
            @Param("productName") String productName,
            @Param("providerId") Long providerId,
            @Param("isPayment") Integer isPayment);
    
    /**
     * 分页查询账单
     */
    List<Bill> findByConditionPage(
            @Param("productName") String productName,
            @Param("providerId") Long providerId,
            @Param("isPayment") Integer isPayment,
            @Param("billCode") String billCode,
            @Param("offset") Integer offset,
            @Param("pageSize") Integer pageSize);
    
    /**
     * 统计符合条件的账单总数
     */
    int countByCondition(
            @Param("productName") String productName,
            @Param("providerId") Long providerId,
            @Param("isPayment") Integer isPayment,
            @Param("billCode") String billCode);
    
    /**
     * 添加账单
     */
    int add(Bill bill);
    
    /**
     * 修改账单
     */
    int update(Bill bill);
    
    /**
     * 删除账单
     */
    int deleteById(Long id);
    
    /**
     * 根据供应商ID查询账单数量
     */
    int countByProviderId(Long providerId);
    
    /**
     * 根据账单编码查询账单
     */
    Bill findByBillCode(@Param("billCode") String billCode);
    
    /**
     * 检查账单编码是否存在（排除指定ID）
     */
    Bill findByBillCodeExcludeId(@Param("billCode") String billCode, @Param("id") Long id);
    
    /**
     * 统计今日账单数量
     */
    int countTodayBills();
    
    /**
     * 统计昨日账单数量
     */
    int countYesterdayBills();
    
    /**
     * 统计本周账单数量
     */
    int countWeekBills();
    
    /**
     * 统计本月账单数量
     */
    int countMonthBills();
    
    /**
     * 获取最近7天账单数量趋势
     */
    @MapKey("date")
    List<Map<String, Object>> getLast7DaysBillCount();
    /**
     * 获取最近7天账单金额趋势
     */
    @MapKey("date")
    List<Map<String, Object>> getLast7DaysBillAmount();
}
